home *** CD-ROM | disk | FTP | other *** search
/ NetNews Offline 2 / NetNews Offline Volume 2.iso / news / comp / sys / amiga / programmer / 6489 < prev    next >
Encoding:
Internet Message Format  |  1996-08-05  |  2.1 KB

  1. Subject: Re: random number in assembly
  2. References: <Pine.NEB.3.91.960327200012.12939A-100000@dirty.cute.fi>
  3. X-Newsreader: TIN [version 1.2 PL2]
  4. Path: imada.ou.dk!breese
  5. From: breese@imada.ou.dk (Bjorn Reese)
  6. Message-ID: <1996Mar28.133904.5493@imada.ou.dk>
  7. Sender: news@imada.ou.dk
  8. Nntp-Posting-Host: wagner.imada.ou.dk
  9. Organization: Dept. of Math. & Computer Science, Odense University, Denmark
  10. Date: Thu, 28 Mar 1996 13:39:04 GMT
  11. Newsgroups: comp.sys.amiga.programmer
  12.  
  13. Kristian Slavov (kslavov@dirty.cute.fi) wrote:
  14. > Hi!
  15. > Could someone tell me how to get a VERY WELL randomized number?
  16.  
  17. Here's one: 2 :)
  18.  
  19. > I've tried all kinds of methods but they are not enough random :(
  20. > To make the problem a little bit harder I need a routine that can be used 
  21. > in loops so that the numbers wouldn't be for ex. 4,8,12,16,20 or 
  22. > 2,3,4,5,6,7. Hope you understood that :) 
  23.  
  24. Here's my favorite (unfortunately in C, but it should be easy to
  25. translate to asm - it's originates from Knuth, and was done in some
  26. kind of asm)
  27.  
  28. InitRandom() initializes the rndValues array with random numbers.
  29. These numbers are picked and altered by Random(). Random() has
  30. a long sequence and is quick.
  31.  
  32.  
  33.  
  34. /* RNDSIZE must be an integral number of 2 (and at least 8) */
  35. #define RNDSIZE 64
  36. #define RNDMASK RNDSIZE-1
  37.  
  38. static RND rnd1;
  39. static RND rnd2;
  40. static RND rndValues[RNDSIZE];
  41.  
  42. /* --- Random ----------------------------------------------------- */
  43.  
  44. inline RND Random(void)
  45. {
  46.   rnd1 = (rnd1 - 1) & RNDMASK;
  47.   rnd2 = (rnd2 - 1) & RNDMASK;
  48.   return (rndValues[rnd2] += rndValues[rnd1]);
  49. }
  50.  
  51. /* --- InitRandom ------------------------------------------------- */
  52.  
  53. void InitRandom(int s)
  54. {
  55.   int i;
  56.  
  57.   for (i = 0; i < RNDSIZE; i++) {
  58.     rndValues[i] = (RND)s;
  59.     /* --- randqd1() from Numerical Recipes --- */
  60.     s = 0x0019660dL * s + 0x3c6ef35fL;
  61.   }
  62.   rnd1 = 0;
  63.   rnd2 = RNDSIZE/2 - 3;
  64.  
  65.   /* --- Remove initial errors of bad seeding (warn-up) --- */
  66.   for (i = 0; i < RNDSIZE; i++) Random();
  67. }
  68.  
  69. --
  70. Bjorn Reese                      Email: breese@imada.ou.dk
  71. Odense University, Denmark       URL:   http://www.imada.ou.dk/~breese
  72.  
  73. "It's getting late in the game to show any pride or shame" - Marillion
  74.